/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.inve.manager;

import com.brain.conf.dto.AlmacenDto;
import com.brain.conf.dto.AlmacenUbicacionDto;
import com.brain.conf.dto.ProductoDetaDto;
import com.brain.conf.dto.ProductoDto;
import com.brain.conf.dto.TipoConversionDto;
import com.brain.conf.dto.UnidadMedidaDto;
import com.brain.conf.manager.*;
import com.brain.core.manager.*;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.core.view.util.ConstantesCore;
import com.brain.inve.dto.TransfUnidadMedidaDto;
import com.brain.inve.view.util.ConstantesInve;
import com.brain.inve.view.util.ExportarExcelInventario;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Indra
 */
@Service
public class TransfUnidadMedidaManager extends ComunManager<TransfUnidadMedidaDto> implements Serializable {

    private static Logger logger = Logger.getLogger(TransfUnidadMedidaManager.class);
    private Long idEntidad = 254L;
    private Long idCatalogoMotivosTranfUM = 403L;
    @Resource
    private DAOGenerico<TransfUnidadMedidaDto> springHibernateDao;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private ApplicationMBean applicationMBean;
    private final String url = "/pages/inve/transferencia/transfUnidadMedida.xhtml";
    private final String urlLista = "/pages/inve/transferencia/listaTransfUnidadesMedida.xhtml";

    /**
     * obtener Tranferencia UM por Id
     *
     * @param id
     * @return Tranferencia UM
     * @throws DAOException
     */
    public TransfUnidadMedidaDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(TransfUnidadMedidaDto.class, id);
    }

    /**
     * Metodo para inicializar nueva Tranferencia UM
     *
     * @return
     */
    public TransfUnidadMedidaDto inicializar() {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        TransfUnidadMedidaDto dto = new TransfUnidadMedidaDto();
        AlmacenDto almDto = obtenerAlmacenPorDefault();
        AlmacenUbicacionDto auDefault = null;
        dto.setIsSave(Boolean.FALSE);
        for (AlmacenUbicacionDto au : almDto.getListaAlmacenUbicacion()) {
            if (au.getPrincipal()) {
                auDefault = au;
            }
        }
        dto.setProductoDto(new ProductoDto());
        dto.setProductoDetaOrigenDto(new ProductoDetaDto());
        dto.setProductoDetaDestinoDto(new ProductoDetaDto());
        dto.setCantidadTransferidaOrigen(BigDecimal.ONE);
        dto.setCantidadTransferidaDestino(BigDecimal.ZERO);
        dto.setEmpresaDto(sessionMBean.getEmpresaDto());
        dto.setAlmacenDto(almDto);
        dto.setEstado(ConstantesInve.ValoresConstantes.TRASF_UM_COD_ESTADO_ELABORACION);
        dto.setAlmacenUbicacionDto(auDefault);
        if (sessionMBean.getOrganizacionDto() != null) {
            if (sessionMBean.getOrganizacionDto().getId() != null) {
                dto.setOrganizacionDto(sessionMBean.getOrganizacionDto());
            }
        }
        return dto;
    }

    private AlmacenDto obtenerAlmacenPorDefault() {
        AlmacenDto almDto = null;
        try {
            AlmacenManager almacenManager = (AlmacenManager) WebServletContextListener.getApplicationContext().getBean("almacenManager");
            List<AlmacenDto> listaAlmacenes = almacenManager.obtenerAlmacenesActivosPorOrganizacion();
            almDto = listaAlmacenes.get(0);
        } catch (DAOException ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());

        }
        return almDto;
    }

    /**
     * Metodo para obtener Trasferencia UM segun filtro
     *
     * @param dtoFiltro
     * @return Lista de Trasferencia UM
     * @throws DAOException
     */
    public List<TransfUnidadMedidaDto> obtener(TransfUnidadMedidaDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from TransfUnidadMedidaDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }

        if (dtoFiltro.getDescripcion() != null && dtoFiltro.getDescripcion().length() != 0) {
            hqsql += " and upper(e.descripcion) like '%" + dtoFiltro.getDescripcion().toUpperCase() + "%'";
        }

        if (dtoFiltro.getEstado() != null && dtoFiltro.getEstado().length() != 0 && !dtoFiltro.getEstado().equals(ConstantesInve.ValoresConstantes.TRASF_UM_COD_ESTADO_TODOS)) {
            hqsql += " and upper(e.estado) = '" + dtoFiltro.getEstado() + "'";
        }

        if (dtoFiltro.getDescAlmacen() != null && dtoFiltro.getDescAlmacen().length() != 0) {
            hqsql += " and upper(e.almaceDto.nombre) like '%" + dtoFiltro.getDescAlmacen().toUpperCase() + "%'";
        }

        if (dtoFiltro.getDescAlmacenUbica() != null && dtoFiltro.getDescAlmacenUbica().length() != 0) {
            hqsql += " and upper(e.almaceUbicacionDto.nombre) like '%" + dtoFiltro.getDescAlmacenUbica().toUpperCase() + "%'";
        }

        if (dtoFiltro.getDescProducto() != null && dtoFiltro.getDescProducto().length() != 0) {
            hqsql += " and  (upper(e.productoDto.descripcion) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += " or upper(e.productoDto.sku) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += " or upper(e.productoDto.descripcionCorta) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += " or upper(e.productoDto.descripcionDetalle) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += " or upper(e.productoDto.descripcionIdioma1) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += " or upper(e.productoDto.descripcionIdioma2) like '%" + dtoFiltro.getDescProducto().toUpperCase() + "%'";
            hqsql += ")";
        }


        if (dtoFiltro.getFechaInicio() != null && dtoFiltro.getFechaFin() != null) {
            hqsql += " and e.fechaCreacion between ? and ?";
            Calendar c = Calendar.getInstance();
            c.setTime(dtoFiltro.getFechaInicio());
            c.set(Calendar.HOUR, 0);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            listaParametros.add(c.getTime());
            c.setTime(dtoFiltro.getFechaFin());
            c.set(Calendar.HOUR, 23);
            c.set(Calendar.MINUTE, 59);
            c.set(Calendar.SECOND, 59);
            listaParametros.add(c.getTime());
        }
        
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and e.organizacionDto.id = ?";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        }

        hqsql += " order by e.fechaCreacion  desc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo para guardar, editar Trasferencias UM
     *
     * @param dto Trasferencia UM
     * @return cadena de satisfaccion
     */
    public String guardar(TransfUnidadMedidaDto dto) {

        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        try {
            if (dto.getOrganizacionDto() != null) {
                if (dto.getIsSave()) {
                    definirCssPorEstado(dto);
                    {
                        dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
                        dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                        dto.setTerminal(sessionMBean.getSessionTerminal());
                    }
                    if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
                        dto.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
                        dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                        dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                        UtilCore.General.toUpperCaseDto(dto);
                                
                        nuevo(dto);

                        mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                        recursosManager.showMessage(mensajeTrx);

                        to = "";//retroceder();

                    } else if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
                        UtilCore.General.toUpperCaseDto(dto);
                        editar(dto);

                        mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                        recursosManager.showMessage(mensajeTrx);
                        to = "";//retroceder();
                    } else {
                        to = null;
                    }
                } else {
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.mensaje.6");
                    recursosManager.showError(mensajeTrx);
                    to = null;
                }
            } else {
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("general.mensaje.no.organizacion");
                recursosManager.showError(mensajeTrx);
                to = null;
            }
        } catch (Exception ex) {
            mensajeTrx = ex.getMessage();
            recursosManager.showError(ex.getMessage());
            logger.error(mensajeTrx);

            to = null;
        }
        return to;
    }
    
    public String obtenerCadenaUltimaModificacionLista(TransfUnidadMedidaDto dto) {
        String cad = "";
        int diasDif = UtilCore.Fecha.diferenciaDiasFechas(dto.getFecha(), UtilCore.Fecha.obtenerFechaActualDate());
        if (diasDif == 0) {
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.hoy.a.las") + " " + sdf.format(dto.getFecha());            
        }
        else if (diasDif == 1) {
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.ayer.a.las") + " " + sdf.format(dto.getFecha());
        }
        else if (diasDif >1 && diasDif < 7) {
            int diaSemana = 0;
            String diaTexto = "";
            Calendar calendario = Calendar.getInstance();
            calendario.setTime(UtilCore.Fecha.obtenerFechaActualDate());;
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            if (calendario.get(Calendar.DAY_OF_WEEK) > diasDif) {
                diaSemana = calendario.get(Calendar.DAY_OF_WEEK) - diasDif;
            }
            else {
                diaSemana = 7 - Math.abs(calendario.get(Calendar.DAY_OF_WEEK) - diasDif);                
            }
            diaTexto = obtenerDiaSemanaTexto(diaSemana);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.el") + " " + diaTexto + " " + sdf.format(dto.getFecha());
        }
        else {
            Calendar calendario = Calendar.getInstance();
            calendario.setTime(dto.getFecha());
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.hace") + " " + UtilCore.Fecha.diferenciaDiasFechas(dto.getFecha(), UtilCore.Fecha.obtenerFechaActualDate()) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.dias");

        }
        return cad;
    }
    
    public String obtenerEstadoCadena(TransfUnidadMedidaDto dto) {
        String cad = "";
        if (dto.getFecha().after(dto.getFechaCreacion())) {
            if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.TRASF_UM_COD_ESTADO_ELABORACION)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.modificado");
            }
            else if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.TRASF_UM_COD_ESTADO_ANULADO)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.anulado");
            }
            else if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.TRASF_UM_COD_ESTADO_CONFIRMADO)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.confirmado");
            }
        }
        else {
            cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.creado");
        }
        return cad;
    }
    
    public String obtenerDiaSemanaTexto(int dia) {
        String[] diasSemana = {
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.domingo.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.lunes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.martes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.miercoles.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.jueves.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.viernes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.sabado.a.las")
        };
        return diasSemana[dia-1];
    }
    
    public String obtenerMesTexto(int mes) {
        String[] meses = {
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.enero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.febrero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.marzo"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.abril"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.mayo"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.junio"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.julio"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.agosto"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.setiembre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.octubre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.noviembre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.diciembre")            
        };
        return meses[mes];
    }
    
    public String revisarValidacinoesAntesDeGuardar(TransfUnidadMedidaDto dto) {

        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        try {
            if (dto.getOrganizacionDto() != null) {
                if (dto.getIsSave()) {
                    if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
                        to = "";//retroceder();
                    } else {
                        to = null;
                    }
                } else {
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.mensaje.6");
                    recursosManager.showError(mensajeTrx);
                    to = null;
                }
            } else {
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("general.mensaje.no.organizacion");
                recursosManager.showError(mensajeTrx);
                to = null;
            }
        } catch (Exception ex) {
            mensajeTrx = ex.getMessage();
            recursosManager.showError(ex.getMessage());
            logger.error(mensajeTrx);

            to = null;
        }
        return to;
    }

    public TipoConversionDto obtenerFactorConversionUM(UnidadMedidaDto umEntrada, UnidadMedidaDto umSalida) {
        TipoConversionDto tcDto = null;
        TipoConversionManager tipoConversionManager = (TipoConversionManager) WebServletContextListener.getApplicationContext().getBean("tipoConversionManager");
        tcDto = tipoConversionManager.obtenerFactorConversionUM(umEntrada, umSalida);
        if (tcDto.getId() == null) {
            return null;
        }
        return tcDto;
    }

    public void realizarCalculosTransferencia(TransfUnidadMedidaDto dto) {
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        dto.setIsSave(Boolean.TRUE);
        if (dto.getProductoDto().getId() != null) {
            System.out.println("PO --> " + dto.getProductoDetaOrigenDto());
            System.out.println("PD --> " + dto.getProductoDetaDestinoDto());
            dto.setUnidadMedidaOrigenDto(dto.getProductoDetaOrigenDto().getUnidadMedidaDto());
            dto.setUnidadMedidaDestinoDto(dto.getProductoDetaDestinoDto().getUnidadMedidaDto());
            if (!(dto.getCantidadTransferidaOrigen().compareTo(BigDecimal.ZERO) == 0)) {
                if (!dto.getUnidadMedidaOrigenDto().equals(dto.getUnidadMedidaDestinoDto())) {
                    TipoConversionDto tcDto = obtenerFactorConversionUM(dto.getUnidadMedidaOrigenDto(), dto.getUnidadMedidaDestinoDto());
                    if (tcDto != null && tcDto.getFactor() != null && tcDto.getFactor().compareTo(BigDecimal.ZERO) != 0) {
                        System.out.println("FACTOR --> " + tcDto);
                        if (tcDto.getFactor().compareTo(BigDecimal.ONE) > 0) {//Si es factor es mayor a uno
                            //Al ser el factor mayor a uno solo se debe multiplicar el factor por la cantidad origen
                            dto.setCantidadTransferidaDestino(dto.getCantidadTransferidaOrigen().multiply(tcDto.getFactor()));
                        } else if (tcDto.getFactor().compareTo(BigDecimal.ONE) < 0) {//Si es factor es menor a uno
                            //Si el factor es menor que uno asumimos que se trata de una conversion de una unidad menor
                            // a una unidad mayor : formula : factor * (cantO - (resto de CantO entre 1/factor))
                            TipoConversionDto tcDtoAux = obtenerFactorConversionUM(dto.getUnidadMedidaDestinoDto(), dto.getUnidadMedidaOrigenDto());
                            BigDecimal cantOrigenMenosResto = dto.getCantidadTransferidaOrigen().subtract(dto.getCantidadTransferidaOrigen().remainder(tcDtoAux.getFactor()));
                            System.out.println("SIN RESTO --> " + cantOrigenMenosResto);
                            System.out.println("FACTOR --> " + tcDto.getFactor());
                            System.out.println("DOS --> " + cantOrigenMenosResto);
                            BigDecimal conversion = tcDto.getFactor().multiply(cantOrigenMenosResto);
                            dto.setCantidadTransferidaDestino(UtilCore.Numero.round(conversion, 0));
                            dto.setCantidadTransferidaOrigen(cantOrigenMenosResto);
                        }
                        recursosManager.showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.mensaje.8"));
                    } else {
                        dto.setIsSave(Boolean.FALSE);
                        recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.mensaje.3"));
                    }
                } else {
                    dto.setIsSave(Boolean.FALSE);
                    recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.mensaje.2"));
                }
            } else {
                dto.setIsSave(Boolean.FALSE);
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.mensaje.4"));
            }
        } else {
            dto.setIsSave(Boolean.FALSE);
            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.mensaje.5"));
        }
    }

    public void handleProductoChange(TransfUnidadMedidaDto dto) {
        boolean indicador = true;
        if (dto.getProductoDto().getListaUnidadesMedida() != null) {
            if (!dto.getProductoDto().getListaUnidadesMedida().isEmpty()) {
                dto.setCantidadTransferidaOrigen(BigDecimal.ONE);
                dto.setCantidadTransferidaDestino(BigDecimal.ZERO);
            } else {
                indicador = false;
            }
        } else {
            indicador = false;
        }
        if (!indicador) {
            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.mensaje.7"));
        }
    }

    public void definirCssPorEstado(TransfUnidadMedidaDto dto) {
        if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.TRASF_UM_COD_ESTADO_ELABORACION)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssElaboracion);
        } else if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.TRASF_UM_COD_ESTADO_ANULADO)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssAnulado);
        } else if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.TRASF_UM_COD_ESTADO_CONFIRMADO)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssConfirmado);
        }
    }

    public SelectItem[] siEstadosTransfTodos() {
        SelectItem[] si = new SelectItem[4];
        si[0] = new SelectItem(ConstantesInve.ValoresConstantes.TRASF_UM_COD_ESTADO_ELABORACION, ConstantesInve.ValoresConstantes.TRASF_UM_DESC_ESTADO_ELABORACION);
        si[1] = new SelectItem(ConstantesInve.ValoresConstantes.TRASF_UM_COD_ESTADO_CONFIRMADO, ConstantesInve.ValoresConstantes.TRASF_UM_DESC_ESTADO_CONFIRMADO);
        si[2] = new SelectItem(ConstantesInve.ValoresConstantes.TRASF_UM_COD_ESTADO_ANULADO, ConstantesInve.ValoresConstantes.TRASF_UM_DESC_ESTADO_ANULADO);
        si[3] = new SelectItem(ConstantesInve.ValoresConstantes.TRASF_UM_COD_ESTADO_TODOS, ConstantesInve.ValoresConstantes.TRASF_UM_DESC_ESTADO_TODOS);
        return si;
    }

    public void nuevoMuchos(List<TransfUnidadMedidaDto> lista) throws DAOException {
        springHibernateDao.guardarColeccion(lista);
    }

    public void eliminarMuchos(List<TransfUnidadMedidaDto> lista) throws DAOException {
        springHibernateDao.borrarColeccion(lista);
    }
    
    public void generarExcelSeleccionados(ExportarExcelInventario.TransferenciaUnidades exp, TransfUnidadMedidaDto[] selectedTUs) {
        StringBuilder strCabecera = this.obtenerCabeceraExcel(exp);
        List<TransfUnidadMedidaDto> lst = Arrays.asList(selectedTUs);
        List lstCuerpo = this.obtenerCuerpoExcel(exp, lst);
        String nombreArchivo = "TRANSFERENCIA_UNIDAD_MEDIDA" + UtilCore.Fecha.obtenerFechaHoraActual().replace(':', '_') + ".xls";
        this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
        this.recursosManager.viewArchivo(nombreArchivo);
    }
    
    public void generarExcelPorTabla(ExportarExcelInventario.TransferenciaUnidades exp, List<TransfUnidadMedidaDto> lstTU) {
        StringBuilder strCabecera = this.obtenerCabeceraExcel(exp);
        List lstCuerpo = this.obtenerCuerpoExcel(exp, lstTU);
        String nombreArchivo = "TRANSFERENCIA_UNIDAD_MEDIDA" + UtilCore.Fecha.obtenerFechaHoraActual().replace(':', '_') + ".xls";
        this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
        this.recursosManager.viewArchivo(nombreArchivo);
    }
    
    private List obtenerCuerpoExcel(ExportarExcelInventario.TransferenciaUnidades exp, List<TransfUnidadMedidaDto> lst) {
        StringBuilder strCuerpo;
        List lstFilas = new ArrayList();
        for (TransfUnidadMedidaDto x : lst) {
            strCuerpo = new StringBuilder();
            if (exp.getId()) {
                strCuerpo.append(x.getId()).append("|");
            }
            if (exp.getEmpresa()){
                if (x.getEmpresaDto() != null){
                    strCuerpo.append(x.getEmpresaDto().getDescripcion()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getOrganizacion()){
                if (x.getOrganizacionDto() != null){
                    strCuerpo.append(x.getOrganizacionDto().getNombre()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getDescripcion()){
                if (x.getDescripcion() != null){
                    strCuerpo.append(x.getDescripcion()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getProducto()){
                if (x.getProductoDto() != null){
                    strCuerpo.append(x.getProductoDto().getDescripcion()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getProductoDetaOrigen()){
                if (x.getProductoDetaOrigenDto() != null){
                    strCuerpo.append(x.getProductoDetaOrigenDto().getId()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getProductoDetaDestino()){
                if (x.getProductoDetaDestinoDto() != null){
                    strCuerpo.append(x.getProductoDetaDestinoDto().getId()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getAlmacen()){
                if (x.getAlmacenDto() != null){
                    strCuerpo.append(x.getAlmacenDto().getNombre()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getAlmacenUbicacion()){
                if (x.getAlmacenUbicacionDto() != null){
                    strCuerpo.append(x.getAlmacenUbicacionDto().getNombre()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUnidadMedidaOrigen()){
                if (x.getUnidadMedidaOrigenDto() != null){
                    strCuerpo.append(x.getUnidadMedidaOrigenDto().getNombre()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUnidadMedidaDestino()){
                if (x.getUnidadMedidaDestinoDto() != null){
                    strCuerpo.append(x.getUnidadMedidaDestinoDto().getNombre()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getCantidadTransferidaOrigen()){
                if (x.getCantidadTransferidaOrigen() != null){
                    strCuerpo.append(x.getCantidadTransferidaOrigen()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getCantidadTransferidaDestino()){
                if (x.getCantidadTransferidaDestino() != null){
                    strCuerpo.append(x.getCantidadTransferidaDestino()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getEstado()){
                if (x.getEstado() != null){
                    strCuerpo.append(x.getEstadoTexto()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getComentarioMotivo()){
                if (x.getComentarioMotivo() != null){
                    strCuerpo.append(x.getComentarioMotivo()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUsuarioCreacion()){
                if (x.getUsuarioCreacionDto() != null){
                    strCuerpo.append(x.getUsuarioCreacionDto().getDescripcion()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaCreacion()){
                if (x.getFechaCreacion() != null){
                    strCuerpo.append(x.getFechaCreacion()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getTerminalCreacion()){
                if (x.getTerminalCreacion() != null){
                    strCuerpo.append(x.getTerminalCreacion()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUsuarioConfirmacion()){
                if (x.getUsuarioConfirmacionDto() != null){
                    strCuerpo.append(x.getUsuarioConfirmacionDto().getDescripcion()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaConfirmacion()){
                if (x.getFechaConfirmacion() != null){
                    strCuerpo.append(x.getFechaConfirmacion()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUsuarioAnulacion()){
                if (x.getUsuarioAnulacionDto() != null){
                    strCuerpo.append(x.getUsuarioAnulacionDto().getDescripcion()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            lstFilas.add(strCuerpo.toString());
        }
        return lstFilas;
    }
    
    private StringBuilder obtenerCabeceraExcel(ExportarExcelInventario.TransferenciaUnidades exp) {
        StringBuilder strCabecera = new StringBuilder();
        if (exp.getId()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.id")).append("|");
        }
        if (exp.getEmpresa()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.empresa")).append("|");
        }
        if (exp.getOrganizacion()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.organizacion")).append("|");
        }
        if (exp.getDescripcion()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.descripcion")).append("|");
        }
        if (exp.getProducto()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.producto")).append("|");
        }
        if (exp.getProductoDetaOrigen()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.producto.origen")).append("|");
        }
        if (exp.getProductoDetaDestino()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.producto.destino")).append("|");
        }
        if (exp.getAlmacen()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.almacen")).append("|");
        }
        if (exp.getAlmacenUbicacion()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.almacen.ubica")).append("|");
        }
        if (exp.getUnidadMedidaOrigen()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.origen")).append("|");
        }
        if (exp.getUnidadMedidaDestino()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.destino")).append("|");
        }
        if (exp.getCantidadTransferidaOrigen()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.cant.origen")).append("|");
        }
        if (exp.getCantidadTransferidaDestino()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.cant.destino")).append("|");
        }
        if (exp.getEstado()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.estado")).append("|");
        }
        if (exp.getComentarioMotivo()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.comentario.motivo")).append("|");
        }
        if (exp.getUsuarioCreacion()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.usuario.creacion")).append("|");
        }
        if (exp.getFechaCreacion()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.fecha.creacion")).append("|");
        }
        if (exp.getTerminalCreacion()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.terminal.creacion")).append("|");
        }
        if (exp.getUsuarioConfirmacion()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.usuario.confirmacion")).append("|");
        }
        if (exp.getFechaConfirmacion()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.fecha.confirmacion")).append("|");
        }
        if (exp.getUsuarioAnulacion()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.usuario.anulacion")).append("|");
        }
        if (exp.getFechaAnulacion()){
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("transf.um.fecha.anulacion")).append("|");
        }
        return strCabecera;
    }
    
    public ExportarExcelInventario.TransferenciaUnidades onChangeChekExcel(Boolean flag) {
        return new ExportarExcelInventario.TransferenciaUnidades(flag);
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        TransfUnidadMedidaManager.logger = logger;
    }

    public Long getIdEntidad() {
        return idEntidad;
    }

    public void setIdEntidad(Long idEntidad) {
        this.idEntidad = idEntidad;
    }

    public DAOGenerico<TransfUnidadMedidaDto> getSpringHibernateDao() {
        return springHibernateDao;
    }

    public void setSpringHibernateDao(DAOGenerico<TransfUnidadMedidaDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public String getUrl() {
        return url;
    }

    public String getUrlLista() {
        return urlLista;
    }

    public Long getIdCatalogoMotivosTranfUM() {
        return idCatalogoMotivosTranfUM;
    }
    
}
